package com.zjsru.plan2023;

/**
 * @Author: cookLee
 * @Date: 2023-10-02
 * 买卖股票的最佳时机 II
 */
public class MaxProfit {

    /**
     * 输入：prices = [7,1,5,3,6,4]
     * 输出：7
     * 解释：在第 2 天（股票价格 = 1）的时候买入，在第 3 天（股票价格 = 5）的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。
     *      随后，在第 4 天（股票价格 = 3）的时候买入，在第 5 天（股票价格 = 6）的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3 。
     *      总利润为 4 + 3 = 7 。
     * /
     * 输入：prices = [1,2,3,4,5]
     * 输出：4
     * 解释：在第 1 天（股票价格 = 1）的时候买入，在第 5 天 （股票价格 = 5）的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。
     *      总利润为 4 。
     * @param args
     */
    public static void main(String[] args) {
        MaxProfit maxProfit = new MaxProfit();
        int[] prices = new int[]{7,1,5,3,6,4};
        System.out.println(maxProfit.maxProfit(prices));
    }

    public int maxProfit(int[] prices) {
        int len = prices.length;
        //0表示未持有股票，1表示持有股票
        int[][] dp = new int[len][2];
        //初始化第0天未持有股票的利润为0，因为没有进行交易
        dp[0][0] = 0;
        //初始化第0天持有股票的利润为负的第0天股票价格，因为在第0天购买了股票。
        dp[0][1] = -prices[0];
        for (int i = 1; i < len; i++) {
            //a) 保持前一天未持有股票状态（不进行买卖）；b) 前一天持有股票，然后在第i天卖出股票。选择利润最大的情况
            dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i]);
            //a) 保持前一天未持有股票状态（不进行买卖）；b) 前一天持有股票，然后在第i天买入股票。选择利润最大的情况。
            dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
        }
        //存储了最后一天未持有股票时的最大利润
        return dp[len - 1][0];
    }

}
